import asyncio
import os
import time

import aiofiles
import aiohttp
import requests

'''
1.同步操作，拿到所有cid
2.异步操作，获取文章内容
'''


# 定义异步函数 main，接收一个 URL 参数
async def main(url_01):
    # 使用 requests 库发送同步的 GET 请求获取数据
    resp = requests.get(url_01)
    # 将响应数据解析为 JSON 格式
    resp = resp.json()
    # 从 JSON 数据中提取 cids 列表
    cids = resp.get('data').get('novel').get('items')
    # 同步等待 1 秒
    # await asyncio.sleep(1)
    tasks = []
    for cid in cids:
        # 打印章节标题和 cid
        print(cid.get('title'), '------------', cid.get('cid'))
        # 准备异步任务
        tasks.append(get_directory(cid.get('cid')))
    # 等待所有异步任务完成
    await asyncio.wait(tasks)


# 定义异步函数 get_directory，接收一个 cid 参数
async def get_directory(cid):
    # 构建获取章节内容的 URL
    url_02 = 'https://dushu.baidu.com/api/pc/getChapterContent?data={"book_id":"4306063500","cid":"4306063500|%s","need_bookinfo":1}' % (
        cid)
    async with aiohttp.ClientSession() as session:
        async with session.get(url_02) as resp_02:
            # 获取响应数据并解析为 JSON 格式
            data = await resp_02.json()
            # 提取章节标题
            title = data.get('data').get('novel').get('chapter_title')
            # 提取章节内容
            content = data.get('data').get('novel').get('content')
            async with aiofiles.open(title, mode='w', encoding='utf-8') as f:
                # 将章节内容写入文件
                await f.write(content)
                # 刷新文件缓冲区
                await f.flush()


if __name__ == '__main__':
    start = time.time()
    # 定义文件夹路径
    folder_path = r"E:\PyCharm 2022.3.3\projects\pyDemo\main\py知识点\并发编程\novel"
    # 切换到指定文件夹
    os.chdir(folder_path)

    # 创建新的事件循环
    loop = asyncio.new_event_loop()
    # 设置当前事件循环
    asyncio.set_event_loop(loop)
    # 定义获取目录的 URL
    url = 'https://dushu.baidu.com/api/pc/getCatalog?data={"book_id":"4306063500"}'
    # 在事件循环中运行 main 函数并等待其完成
    loop.run_until_complete(main(url))
    end = time.time()
    print(end - start)  # 20.234752655029297
